#pragma once
// event
#include "eventDetection_module.h"

#pragma region 资源分配

/**
*  @b Description
*  @n
*      创建一个事件检测单元（一条轨迹）的实例，程序开启时调用，初始化
*  @param[in] config
*		一个指向道路拓扑结构的指针
*  @param[in] param
*       一个指向事件检测参数的指针
*
*  @retval
*      事件检测单元的指针
*/
void* event_unitCreate(RoadTopology* roadParam, EventConfiguration* param);

/**
*  @b Description
*  @n
*     为事件检测单元分配资源
*  @param[in] handle
*		一个指向事件检测单元的指针
*
*  @retval
*      None
*/
void event_unitStart(void* handle);

/**
*  @b Description
*  @n
*     停止处理并重置一个事件检测单元
*  @param[in] handle
*		一个指向事件检测单元的指针
*
*  @retval
*      None
*/

void event_unitStop(void* handle);//重置资源
/**
*  @b Description
*  @n
*     删除一个事件检测单元
*  @param[in] handle
*		一个指向事件检测单元的指针
*
*  @retval
*      None
*/

void event_unitDelete(void* handle);

/**
*  @b Description
*  @n
*     生成道路相关信息
*  @param[in] handle
*		一个指向事件检测单元的指针
*  @param[in] config
*      一个指向事件检测模块配置参数的指针
*  @retval
*      None
*/
void event_creatRoad(void* handle, event_moduleConfig* config);
#pragma endregion

#pragma region 具体判定函数

/**
*  @b Description
*  @n
*     事件检测的预处理函数，判定目标当前所属车道，保存数据等
*  @param[in] handle
*		一个指向事件检测单元的指针
*  @param[in] t
*      一个指向目标信息的指针
*  @retval
*      是否为新目标的标志
*/
int event_unitPrepross(DetectionUnitInstance* handle, GTRACK_targetDesc* t);

/**
*  @b Description
*  @n
*     非法变道事件的检测函数
*  @param[in] handle
*		一个指向事件检测单元的指针
*  @retval
*      交通事件类型（是否检测出变道事件）
*/
TrafficEventType event_unitLaneChangeDetection(void* handle);

/**
*  @b Description
*  @n
*     逆行事件的检测函数
*  @param[in] handle
*		一个指向事件检测单元的指针
*  @retval
*      交通事件类型（是否检测出逆行事件）
*/
TrafficEventType event_unitRetrogradeDetection(void* handle);

/**
*  @b Description
*  @n
*     超速、低速、停止事件的检测函数
*  @param[in] handle
*		一个指向事件检测单元的指针
*  @retval
*      交通事件类型（超速、低速、停止事件、无事发生）
*/
TrafficEventType event_unitSpeedDetection(void* handle);

#pragma endregion

#pragma region 模块级检测函数 

/**
*  @b Description
*  @n
*     对输入的目标信息进行预处理（模块级预处理函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_modulePreprocess(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);

/**
*  @b Description
*  @n
*     非法变道事件检测（模块级检测函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_moduleLaneChangeDetection(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);

/**
*  @b Description
*  @n
*     逆行事件检测（模块级检测函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_moduleRetrogradeDetection(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);

/**
*  @b Description
*  @n
*     超速、低速、停止事件检测（模块级检测函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_moduleSpeedDetection(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);
#pragma endregion

#pragma region 交通流信息检测

/**
*  @b Description
*  @n
*     交通拥堵事件检测（模块级检测函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @retval
*      None
*/
void event_moduleTrafficJamDetection(void* handle);

/**
*  @b Description
*  @n
*     时间占有率计算函数（模块级函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_moduleTimeOccupancyDetection(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);

/**
*  @b Description
*  @n
*     空间占有率计算函数（模块级函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_moduleSpaceOccupancyDetection(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);

/**
*  @b Description
*  @n
*     断面车头时距计算函数（模块级函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向目标信息的指针
*  @param[in] tNum
*      目标信息的个数
*  @retval
*      None
*/
void event_moduleFlowDetection(void* handle, GTRACK_targetDesc* t, uint16_t* tNum);

#pragma endregion

/**
*  @b Description
*  @n
*     交通信息输出（模块级函数）
*  @param[in] handle
*		一个指向事件检测模块的指针
*  @param[in] t
*		一个指向交通信息的指针
*  @retval
*      None
*/
void event_moduleReport(void* handle, Traffic_info* t);